package czk.concrent.enjoyModelWithNotLock.atomicInterger;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntUnaryOperator;

/**
 * @Author:ChenZhangKun
 * @Date: 2020/6/14 20:20
 */
public class Test1 {
    public static void main(String[] args) {
        AtomicInteger atomicInteger =new AtomicInteger(5);
        // 保证任意复杂运算的原子性。先做运算再获取
        atomicInteger.updateAndGet(i->i*10);
        System.out.println(atomicInteger.get());
        // 保证任意复杂运算的原子性。先获取再做运算
        System.out.println(atomicInteger.getAndUpdate(i -> i * 10));
        System.out.println(atomicInteger.get());

        // 测试模仿的方法
        System.out.println(updateAndGet(atomicInteger, i -> i / 100).get());
        System.out.println(atomicInteger.get()); //5
    }
    // 模仿updateAndGet
    public static AtomicInteger updateAndGet(AtomicInteger atomicInteger, IntUnaryOperator intUnaryOperator){
        // 原子操作
        while (true){
            // 得到原始值
            int pre = atomicInteger.get();
            // 进行原子操作
            int next=intUnaryOperator.applyAsInt(pre);
            // 判断是否有人在更改
            if (atomicInteger.compareAndSet(pre,next)){
                return atomicInteger;
            }
        }
    }
}
